let a: object;
a = {}
a = function() {}

// {} 用来指定对象中可以包含哪些属性
// 语法: {属性名: 属性值, 属性名: 属性值}
// 在属性后面加上 ? 表示属性是可选的
let b: { name: string ,age?: number}
// b = {name: 'Mike', age: 20}  //这里的结构须和上面的格式一致
// 可以这样解决
b = { name: 'Mike', age: 20 }


// propName 是自定义的,字符串属性名
// [propName: string] : any  表示任意类型属性
let c: { name: string, [propName: string]: any}
c = { name: '猪八戒', a: 1, b: 2 }

/**
 * 设置函数结构的类型声明
 *      语法: (形参: 类型, 形参: 类型, ...) => 返回值
 */
let d: (a: number, b: number) => number


/**
 * 数组的类型声明
 *  1. 类型[]
 *  2. Array<类型>
 */
// string[] 字符串数组
let e: string[]
e = ['1', 'a']

// number[] 数值类型的数组
let f: number[]
let g: Array<number>

/**
 * 元组: 固定长度的数组
 */

let h: [string, string] //两个值, 一个是字符串,另一个也是,多写,少写,类型不对,都不行
h = ['hello', '1']


/**
 *  enum 枚举 ts独有的
 *  
 */
// let i: { name: string, gender: string }

enum Gender{
  Male = 0,
  Female = 1
}
let i: { name: string, gender: Gender }
i = {
  name: '孙悟空',
  gender: Gender.Male
}

console.log(i.gender === Gender.Male)


let j: string | number // 没有意义
// & 表示同时
let k: { name: string } & { age: number }
k = { name: '沙僧', age: 10 }


// 类型的别名
type myType = string //给 string 起个别名

// 档类型较长时可以用这种方法, 例如下面这种
type oneType = 1 | 2 | 3 | 4 | 5

let m: oneType
m = 2 //可以
m = 5

